fn test7_1() {
    #[derive(Debug, Copy, Clone)] //表明了复合类型结构体Book已经通过派生属性#[derive(Copy,Clone)]实现了Copy
                                  //但是如果结构体中使用了移动语义的成员字段，则不允许实现Copy.
    struct Book<'a> {
        name: &'a str,
        isbn: i32,
        version: i32,
    }

    let book = Book {
        name: "Rust Example",
        isbn: 20200417,
        version: 1,
    };

    let book2 = Book { version: 2, ..book }; //创建book2，使用结构体更新语法"..."时，book的所有权并未被转移，
                                             //结构体的更新语法允许使用"..."来减少代码重复
    println!("{:?}", book); //结构体Book 的成员字段均为复制语义的类型，这里可以正常运行
    println!("{:?}", book2);
}
fn test7_2() {
    //#[derive(Debug, Copy, Clone)]// the trait Copy may not be implemented for this type
    #[derive(Debug, Clone)] // the trait Copy may not be implemented for this type
    struct Book {
        name: String, // this field does not implement Copy [E0204]
        isbn: i32,
        version: i32,
    }
    // Rust不允许包含了String类型字段的结构体实现Copy.
    // 代数数据类型有力保障了复合数据类型的类型安全。
    // 这里的更新语法会转移字段的所有权。
    let book = Book {
        name: "Rust Example".to_string(),
        isbn: 20200417,
        version: 1,
    };

    let book2 = Book { version: 2, ..book };
    //..book 语法会将除version字段之外的其它字段的所有权转移，
    //name 是String类型，属于移动语义，所有name会被转移所有权。
    //    println!("{:?}", book);// borrow of moved value :book value borrowed here after partial move
    //    book 的部分字符串的所有权已经被转移
    println!("{:?}", book2);
}

fn test7_3() {
    //    let hi = "hello".red().on_yellow();
    //    println!("{}", hi);
}
fn test7_4() {
    let s = String::new();

    if s.is_empty() {
        println!("s is empty()");
    }
}
fn main() {
    test7_1();
    //test7_2();
    test7_4();
}
